#ifndef __GKOS_GLOBAL_H
#define __GKOS_GLOBAL_H

// *******************************************************************
// 定义常用的整数类型和指针类型。这里指针类型使用uint32_t实现，通过宏实现指针类型和整数类型的相互转化
typedef signed char int8_t;
typedef signed short int int16_t;
typedef signed int int32_t;
typedef signed long int64_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long uint64_t;

typedef char * String;

typedef uint32_t ptr_i;
typedef void*    ptr_t;
typedef uint32_t ptr_diff;

#define NULL    0
//将一个32位整数化为指针的形式
#define PTR_T(x)  ((void*)(x))
//将一个指针化为32位整数的表示形式
#define INT_T(x)  ((uint32_t)(x)) 
//读取ptr_t指向的8位整数的内容
#define PTR_R(x)  (*((uint8_t*)(x)))
//读取ptr_t指向的32位整数的内容
#define PTR32_R(x)  (*((uint32_t*)(x)))
#define INT8_T(x)   ((uint8_t)(x))
// *******************************************************************
//定义两个bitvec宏，方便提取出整数的某些位，即x[high:low]的表示，分别是在原地和不在原地的形式
#define BitVector(x, low, high)     (((x) >> (low)) & (~((-1) << ((high) - (low) + 1))))
#define BitVectorShl(x, low, high)  ((((x) >> (low)) & (~((-1) << ((high) - (low) + 1)))) << (low))
#define GetBit(x, pos)              (((1 << (pos)) & (x)) >> (pos)) 
#define GetBitShl(x, pos)           ((1 << (pos)) & (x)) 
// *******************************************************************
// 定义分段所用到的变量

// 定义段描述符高32位的各种属性
#define DESC_BASE_31TO24_OFFSET   24
#define DESC_G_4K                 1<<23
#define DESC_D_32                 1<<22
#define DESC_B_32                 1<<22
#define DESC_L_64                 1<<21
#define DESC_AVL_1                1<<20
#define DESC_LIMIT_19TO16_OFFSET  16
#define DESC_P_1                  1<<15
#define DESC_DPL_0                0<<13
#define DESC_DPL_1                1<<13
#define DESC_DPL_2                2<<13
#define DESC_DPL_3                3<<13
#define DESC_S_USR                1<<12
#define DESC_TYPE_X_EXE           1<<11
#define DESC_TYPE_C_COR           1<<10
#define DESC_TYPE_E_DOWN          1<<10
#define DESC_TYPE_R               1<<9
#define DESC_TYPE_W               1<<9
#define DESC_TYPE_A               1<<8
#define DESC_BASE_23TO16_OFFSET   0

// 定义段选择子的属性
#define SELECTOR_GDTINDEX_OFFSET    3
#define SELECTOR_TI_LDT			  	1<<1
#define SELECTOR_RPL_0		   	    0
#define SELECTOR_RPL_1		   	    1
#define SELECTOR_RPL_2		   	    2
#define SELECTOR_RPL_3		   	    3

// *******************************************************************
// 定义通用的宏和变量
// 定义内存基址
#define MEM_BASE                      PTR_T(0)   

//定义max和min宏
#define max_M(x, y)                   (((x) > (y)) ? (x) : (y))
#define min_M(x, y)                   (((x) < (y)) ? (x) : (y))

#define ROUNDUP(x, ALIGN)             (((x) + (ALIGN) - 1) & (~((ALIGN) - 1)))

// 可变参数宏
typedef char* va_list;
#define va_start(varp, v)              (varp = (va_list)&v)
#define va_arg(varp, type)             (*(type*)((varp += 4)))
#define va_end(varp)                   (varp = (va_list)0)
#endif